package concurrencyCookBook.countDownLatch;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 在Java5的多线程中，可以使用Callable接口来实现具有返回值的线程。使用线程池的submit方法提交Callable任务，利用submit方法返回的Future存根，调用此存根的get方法来获取整个线程池中所有任务的运行结果。

方法一：如果是自己写代码，应该是自己维护一个Collection保存submit方法返回的Future存根，然后在主线程中遍历这个Collection并调用Future存根的get()方法取到线程的返回值。

方法二：使用CompletionService类，它整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行，然后使用类似于队列中的take方法获取线程的返回值。
 *
 */
public class RunPerson implements Runnable{
	private Lock lock=new ReentrantLock();
	private final CountDownLatch controoler;
	private Integer i;
	public RunPerson(Integer i){
		//初始化
		controoler=new CountDownLatch(i);
		this.i=i;
	}
	public void arrive(){
		//这个必须实现锁不然 getCount不准确
		lock.lock();
		try {
			TimeUnit.SECONDS.sleep(1);
			controoler.countDown();
			System.out.println("还剩多少人"+controoler.getCount());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
	
	@Override
	public void run() {
		try {
			//等待,知道有i个人来为止就调用下面代码
			controoler.await();
			System.out.println("全部来了");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
